just return when we have an input_only window (fix by Owen Taylor)
authorKristian Rietveld <kris@gtk.org>
Sat, 16 Mar 2002 23:30:44 +0000 (23:30 +0000)
committerKristian Rietveld <kristian@src.gnome.org>
Sat, 16 Mar 2002 23:30:44 +0000 (23:30 +0000)
Sat Mar 16 23:54:56 2002  Kristian Rietveld  <kris@gtk.org>

        * gdk/x11/gdkwindow-x11.c (gdk_window_set_static_bit_gravity): just
        return when we have an input_only window (fix by Owen Taylor)

        * gtk/gtktreeprivate.h (struct _GtkTreeViewPrivate): add
        scroll_sync_timer

        * gtk/gtktreeview.c (install_scroll_sync_handler): new function,
        (scroll_sync_handler): ditto,
        (gtk_tree_view_unrealize): take scroll_sync_timer into account
        (gtk_tree_view_row_deleted): install scroll_sync_timer instead of
        calling top_row_to_dy/dy_to_top_row directly
        -- this greatly speeds up clearing the model (#73199)

        * gtk/gtktreemodelsort.c
        (gtk_tree_model_sort_convert_path_to_child_path): fix up this function,
        for some reason I really screwed it up (fixes #74663)

ChangeLog
ChangeLog.pre-2-10
ChangeLog.pre-2-2
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
gdk/x11/gdkwindow-x11.c
gtk/gtktreemodelsort.c
gtk/gtktreeprivate.h
gtk/gtktreeview.c

index 801b3be608f23ea2914ff816c7b655c0108311c0..16a8effccee7f5a2f2dcd19690fdf9afe084d4f8 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,22 @@
+Sat Mar 16 23:54:56 2002  Kristian Rietveld  <kris@gtk.org>
+
+       * gdk/x11/gdkwindow-x11.c (gdk_window_set_static_bit_gravity): just
+       return when we have an input_only window (fix by Owen Taylor)
+
+       * gtk/gtktreeprivate.h (struct _GtkTreeViewPrivate): add
+       scroll_sync_timer
+
+       * gtk/gtktreeview.c (install_scroll_sync_handler): new function,
+       (scroll_sync_handler): ditto,
+       (gtk_tree_view_unrealize): take scroll_sync_timer into account
+       (gtk_tree_view_row_deleted): install scroll_sync_timer instead of
+       calling top_row_to_dy/dy_to_top_row directly
+       -- this greatly speeds up clearing the model (#73199)
+
+       * gtk/gtktreemodelsort.c
+       (gtk_tree_model_sort_convert_path_to_child_path): fix up this function,
+       for some reason I really screwed it up (fixes #74663)
+
 2002-03-16  Sven Neumann  <sven@gimp.org>
 
        * configure.in (GDK_PIXBUF_DEP_CFLAGS) (GDK_PIXBUF_XLIB_DEP_CFLAGS) 
index 801b3be608f23ea2914ff816c7b655c0108311c0..16a8effccee7f5a2f2dcd19690fdf9afe084d4f8 100644 (file)
@@ -1,3 +1,22 @@
+Sat Mar 16 23:54:56 2002  Kristian Rietveld  <kris@gtk.org>
+
+       * gdk/x11/gdkwindow-x11.c (gdk_window_set_static_bit_gravity): just
+       return when we have an input_only window (fix by Owen Taylor)
+
+       * gtk/gtktreeprivate.h (struct _GtkTreeViewPrivate): add
+       scroll_sync_timer
+
+       * gtk/gtktreeview.c (install_scroll_sync_handler): new function,
+       (scroll_sync_handler): ditto,
+       (gtk_tree_view_unrealize): take scroll_sync_timer into account
+       (gtk_tree_view_row_deleted): install scroll_sync_timer instead of
+       calling top_row_to_dy/dy_to_top_row directly
+       -- this greatly speeds up clearing the model (#73199)
+
+       * gtk/gtktreemodelsort.c
+       (gtk_tree_model_sort_convert_path_to_child_path): fix up this function,
+       for some reason I really screwed it up (fixes #74663)
+
 2002-03-16  Sven Neumann  <sven@gimp.org>
 
        * configure.in (GDK_PIXBUF_DEP_CFLAGS) (GDK_PIXBUF_XLIB_DEP_CFLAGS) 
index 801b3be608f23ea2914ff816c7b655c0108311c0..16a8effccee7f5a2f2dcd19690fdf9afe084d4f8 100644 (file)
@@ -1,3 +1,22 @@
+Sat Mar 16 23:54:56 2002  Kristian Rietveld  <kris@gtk.org>
+
+       * gdk/x11/gdkwindow-x11.c (gdk_window_set_static_bit_gravity): just
+       return when we have an input_only window (fix by Owen Taylor)
+
+       * gtk/gtktreeprivate.h (struct _GtkTreeViewPrivate): add
+       scroll_sync_timer
+
+       * gtk/gtktreeview.c (install_scroll_sync_handler): new function,
+       (scroll_sync_handler): ditto,
+       (gtk_tree_view_unrealize): take scroll_sync_timer into account
+       (gtk_tree_view_row_deleted): install scroll_sync_timer instead of
+       calling top_row_to_dy/dy_to_top_row directly
+       -- this greatly speeds up clearing the model (#73199)
+
+       * gtk/gtktreemodelsort.c
+       (gtk_tree_model_sort_convert_path_to_child_path): fix up this function,
+       for some reason I really screwed it up (fixes #74663)
+
 2002-03-16  Sven Neumann  <sven@gimp.org>
 
        * configure.in (GDK_PIXBUF_DEP_CFLAGS) (GDK_PIXBUF_XLIB_DEP_CFLAGS) 
index 801b3be608f23ea2914ff816c7b655c0108311c0..16a8effccee7f5a2f2dcd19690fdf9afe084d4f8 100644 (file)
@@ -1,3 +1,22 @@
+Sat Mar 16 23:54:56 2002  Kristian Rietveld  <kris@gtk.org>
+
+       * gdk/x11/gdkwindow-x11.c (gdk_window_set_static_bit_gravity): just
+       return when we have an input_only window (fix by Owen Taylor)
+
+       * gtk/gtktreeprivate.h (struct _GtkTreeViewPrivate): add
+       scroll_sync_timer
+
+       * gtk/gtktreeview.c (install_scroll_sync_handler): new function,
+       (scroll_sync_handler): ditto,
+       (gtk_tree_view_unrealize): take scroll_sync_timer into account
+       (gtk_tree_view_row_deleted): install scroll_sync_timer instead of
+       calling top_row_to_dy/dy_to_top_row directly
+       -- this greatly speeds up clearing the model (#73199)
+
+       * gtk/gtktreemodelsort.c
+       (gtk_tree_model_sort_convert_path_to_child_path): fix up this function,
+       for some reason I really screwed it up (fixes #74663)
+
 2002-03-16  Sven Neumann  <sven@gimp.org>
 
        * configure.in (GDK_PIXBUF_DEP_CFLAGS) (GDK_PIXBUF_XLIB_DEP_CFLAGS) 
index 801b3be608f23ea2914ff816c7b655c0108311c0..16a8effccee7f5a2f2dcd19690fdf9afe084d4f8 100644 (file)
@@ -1,3 +1,22 @@
+Sat Mar 16 23:54:56 2002  Kristian Rietveld  <kris@gtk.org>
+
+       * gdk/x11/gdkwindow-x11.c (gdk_window_set_static_bit_gravity): just
+       return when we have an input_only window (fix by Owen Taylor)
+
+       * gtk/gtktreeprivate.h (struct _GtkTreeViewPrivate): add
+       scroll_sync_timer
+
+       * gtk/gtktreeview.c (install_scroll_sync_handler): new function,
+       (scroll_sync_handler): ditto,
+       (gtk_tree_view_unrealize): take scroll_sync_timer into account
+       (gtk_tree_view_row_deleted): install scroll_sync_timer instead of
+       calling top_row_to_dy/dy_to_top_row directly
+       -- this greatly speeds up clearing the model (#73199)
+
+       * gtk/gtktreemodelsort.c
+       (gtk_tree_model_sort_convert_path_to_child_path): fix up this function,
+       for some reason I really screwed it up (fixes #74663)
+
 2002-03-16  Sven Neumann  <sven@gimp.org>
 
        * configure.in (GDK_PIXBUF_DEP_CFLAGS) (GDK_PIXBUF_XLIB_DEP_CFLAGS) 
index 801b3be608f23ea2914ff816c7b655c0108311c0..16a8effccee7f5a2f2dcd19690fdf9afe084d4f8 100644 (file)
@@ -1,3 +1,22 @@
+Sat Mar 16 23:54:56 2002  Kristian Rietveld  <kris@gtk.org>
+
+       * gdk/x11/gdkwindow-x11.c (gdk_window_set_static_bit_gravity): just
+       return when we have an input_only window (fix by Owen Taylor)
+
+       * gtk/gtktreeprivate.h (struct _GtkTreeViewPrivate): add
+       scroll_sync_timer
+
+       * gtk/gtktreeview.c (install_scroll_sync_handler): new function,
+       (scroll_sync_handler): ditto,
+       (gtk_tree_view_unrealize): take scroll_sync_timer into account
+       (gtk_tree_view_row_deleted): install scroll_sync_timer instead of
+       calling top_row_to_dy/dy_to_top_row directly
+       -- this greatly speeds up clearing the model (#73199)
+
+       * gtk/gtktreemodelsort.c
+       (gtk_tree_model_sort_convert_path_to_child_path): fix up this function,
+       for some reason I really screwed it up (fixes #74663)
+
 2002-03-16  Sven Neumann  <sven@gimp.org>
 
        * configure.in (GDK_PIXBUF_DEP_CFLAGS) (GDK_PIXBUF_XLIB_DEP_CFLAGS) 
index 6d2aa0c6cbbcf99b0ca1e805139f1f074dfa29b6..a2a61ed69e6384553270a9b3258f298ca918a77b 100644 (file)
@@ -3906,9 +3906,14 @@ static void
 gdk_window_set_static_bit_gravity (GdkWindow *window, gboolean on)
 {
   XSetWindowAttributes xattributes;
+  GdkWindowObject *private;
   guint xattributes_mask = 0;
   
   g_return_if_fail (window != NULL);
+
+  private = GDK_WINDOW_OBJECT (window);
+  if (private->input_only)
+    return;
   
   xattributes.bit_gravity = StaticGravity;
   xattributes_mask |= CWBitGravity;
index 6ae397e68340386ca3dc360f03943840d95f85b1..1869090759bb25a926bfb4fb6ddc95633de39f0a 100644 (file)
@@ -1964,14 +1964,16 @@ gtk_tree_model_sort_convert_path_to_child_path (GtkTreeModelSort *tree_model_sor
   for (i = 0; i < gtk_tree_path_get_depth (sorted_path); i++)
     {
       if ((level == NULL) ||
-         (level->array->len > sorted_indices[i]))
+         (level->array->len <= sorted_indices[i]))
        {
          gtk_tree_path_free (retval);
          return NULL;
        }
       if (g_array_index (level->array, SortElt, sorted_indices[i]).children == NULL)
        gtk_tree_model_sort_build_level (tree_model_sort, level, &g_array_index (level->array, SortElt, sorted_indices[i]));
+
       if (level == NULL)
+       break;
 
       gtk_tree_path_append_index (retval, g_array_index (level->array, SortElt, i).offset);
     }
index 6e11fc367cd572218652b9a0afe6f8a6452e8f35..75c84db2b12b03d40efe59bf2ac6df7252b03ddc 100644 (file)
@@ -116,6 +116,7 @@ struct _GtkTreeViewPrivate
   GtkTreeViewColumn *edited_column;
   guint presize_handler_timer;
   guint validate_rows_timer;
+  guint scroll_sync_timer;
 
   /* Focus code */
   GtkTreeViewColumn *focus_column;
index 66d48b2527d1b4a9df1d6a7b5500d0e137dd4ed3..87a80084c82e5e0ae947e51b7fcc7df3acddc802 100644 (file)
@@ -42,6 +42,7 @@
 
 #define GTK_TREE_VIEW_SEARCH_DIALOG_KEY "gtk-tree-view-search-dialog"
 #define GTK_TREE_VIEW_PRIORITY_VALIDATE (GDK_PRIORITY_REDRAW + 5)
+#define GTK_TREE_VIEW_PRIORITY_SCROLL_SYNC (GTK_TREE_VIEW_PRIORITY_VALIDATE + 2)
 #define GTK_TREE_VIEW_NUM_ROWS_PER_IDLE 500
 #define SCROLL_EDGE_SIZE 15
 #define EXPANDER_EXTRA_PADDING 4
@@ -263,6 +264,7 @@ static void     validate_visible_area    (GtkTreeView *tree_view);
 static gboolean validate_rows_handler    (GtkTreeView *tree_view);
 static gboolean presize_handler_callback (gpointer     data);
 static void     install_presize_handler  (GtkTreeView *tree_view);
+static void     install_scroll_sync_handler (GtkTreeView *tree_view);
 static void    gtk_tree_view_dy_to_top_row (GtkTreeView *tree_view);
 static void     gtk_tree_view_top_row_to_dy (GtkTreeView *tree_view);
 
@@ -1357,6 +1359,12 @@ gtk_tree_view_unrealize (GtkWidget *widget)
       tree_view->priv->validate_rows_timer = 0;
     }
 
+  if (tree_view->priv->scroll_sync_timer != 0)
+    {
+      gtk_timeout_remove (tree_view->priv->scroll_sync_timer);
+      tree_view->priv->scroll_sync_timer = 0;
+    }
+
   for (list = tree_view->priv->columns; list; list = list->next)
     _gtk_tree_view_column_unrealize_button (GTK_TREE_VIEW_COLUMN (list->data));
 
@@ -4048,6 +4056,34 @@ install_presize_handler (GtkTreeView *tree_view)
     }
 }
 
+static gboolean
+scroll_sync_handler (GtkTreeView *tree_view)
+{
+
+  GDK_THREADS_ENTER ();
+
+  if (gtk_tree_row_reference_valid (tree_view->priv->top_row))
+    gtk_tree_view_top_row_to_dy (tree_view);
+  else
+    gtk_tree_view_dy_to_top_row (tree_view);
+
+  tree_view->priv->scroll_sync_timer = 0;
+
+  GDK_THREADS_LEAVE ();
+
+  return FALSE;
+}
+
+static void
+install_scroll_sync_handler (GtkTreeView *tree_view)
+{
+  if (!tree_view->priv->scroll_sync_timer)
+    {
+      tree_view->priv->scroll_sync_timer =
+       g_idle_add_full (GTK_TREE_VIEW_PRIORITY_SCROLL_SYNC, (GSourceFunc) scroll_sync_handler, tree_view, NULL);
+    }
+}
+
 /* Always call this iff dy is in the visible range.  If the tree is empty, then
  * it's set to be NULL, and top_row_dy is 0;
  */
@@ -4103,6 +4139,7 @@ gtk_tree_view_top_row_to_dy (GtkTreeView *tree_view)
       gtk_tree_row_reference_free (tree_view->priv->top_row);
       tree_view->priv->top_row = NULL;
       tree_view->priv->top_row_dy = 0;
+      /* DO NOT install the idle handler */
       gtk_tree_view_dy_to_top_row (tree_view);
       return;
     }
@@ -4110,7 +4147,7 @@ gtk_tree_view_top_row_to_dy (GtkTreeView *tree_view)
   if (MAX (BACKGROUND_HEIGHT (node), tree_view->priv->expander_size)
       < tree_view->priv->top_row_dy)
     {
-      /* new top row */
+      /* new top row -- do NOT install the idle handler */
       gtk_tree_view_dy_to_top_row (tree_view);
       return;
     }
@@ -5835,10 +5872,7 @@ gtk_tree_view_row_deleted (GtkTreeModel *model,
       _gtk_rbtree_remove_node (tree, node);
     }
 
-  if (gtk_tree_row_reference_valid (tree_view->priv->top_row))
-    gtk_tree_view_top_row_to_dy (tree_view);
-  else
-    gtk_tree_view_dy_to_top_row (tree_view);
+  install_scroll_sync_handler (tree_view);
 
   gtk_widget_queue_resize (GTK_WIDGET (tree_view));